package unmsm.eapisw.taller.srh_persistencia.modelo;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name="SAC_USUARIO")
public class Usuario implements Serializable{
	
	private int id;
	private Hotel usuarioHotel;
	private String nombre;
	private String usuario;
	private String password;
	private int estado;
	private int tipo;
	private int cambiopass;
	
	private Set<Permisos> permisos = new HashSet<Permisos>(0);
	
	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="IN_IDUSUARIO")
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	@ManyToOne(cascade = CascadeType.ALL)
	@JoinColumn(name = "IN_IDHOTEL")
	public Hotel getUsuarioHotel() {
		return usuarioHotel;
	}
	
	public void setUsuarioHotel(Hotel usuarioHotel) {
		this.usuarioHotel = usuarioHotel;
	}
	
	@Column(name="VC_NOMBRE")
	public String getNombre() {
		return nombre;
	}
	
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	@Column(name="VC_USUARIO", nullable=false)
	public String getUsuario() {
		return usuario;
	}
	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}
	
	@Column(name="VC_PASSWORD", nullable=false)
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
	@Column(name="IN_ESTADO", nullable=false)
	public int getEstado() {
		return estado;
	}
	public void setEstado(int estado) {
		this.estado = estado;
	}
	
	@Column(name="IN_TIPO")
	public int getTipo() {
		return tipo;
	}
	public void setTipo(int tipo) {
		this.tipo = tipo;
	}
	/*@ManyToMany(cascade = CascadeType.ALL)
	 * Con esta anotación no actualiza los valores actuales que tiene el objeto (no realiza update a las tablas asociadas)
	 *@ManyToMany
	 *con esta anotacion, si existe el id de una tabla asociada no le hace update 
	 * */

	@ManyToMany
	@JoinTable(name="SAC_USUARIOPERMISOS",
	joinColumns={@JoinColumn(name="IN_IDUSUARIO", referencedColumnName="IN_IDUSUARIO")}, 
	inverseJoinColumns={@JoinColumn(name="IN_IDPERMISOS", referencedColumnName="IN_IDPERMISOS")})
	public Set<Permisos> getPermisos() {
		return permisos;
	}
	public void setPermisos(Set<Permisos> permisos) {
		this.permisos = permisos;
	}
	
	public boolean addPermisos(Permisos ps){
		return permisos.add(ps);
	}
	
	@Column(name="IN_CAMBIOPASS")
	public int getCambiopass() {
		return cambiopass;
	}
	
	
	public void setCambiopass(int cambiopass) {
		this.cambiopass = cambiopass;
	}
}
